package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import co.gov.medellin.ssti.sub.model.dao.IRepDetCruceDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.BeneficiarioVO;
import co.gov.medellin.ssti.sub.model.vo.RepDetCruceVO;

public class RepDetCruceDAOImpl extends BaseDAOImpl implements IRepDetCruceDAO {

	public RepDetCruceDAOImpl(Connection con) {
		super(con);
	}

	public Collection<BeneficiarioVO> findBeneficiariosCruce(
			RepDetCruceVO criteria) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "";
		List<Object> parameters = new ArrayList<Object>();

		if (!criteria.getDesde().equals("") && !criteria.getHasta().equals("")) {
			if (criteria.getCodeSubprogramaFuente() != null) {
				if (criteria.getInclusion().equals("Ambos")) {
					if (criteria.getCodeSubprogramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') "
								+ " INTERSECT\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy')";
						parameters.add(criteria.getCodeSubprogramaFuente());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getCodeProgramaDestino());
						parameters.add(criteria.getHasta());

					} else if (criteria.getCodeProgramaDestino() != null) {
						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') "
								+ " INTERSECT\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') and to_date(?,'dd/mm/yyyy')";
						parameters.add(criteria.getCodeSubprogramaFuente());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getCodeProgramaDestino());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
					} else {
						query = "SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE,"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO, programa.NOMBRE NOMBREPROGRAMA, subprograma.NOMBRE NOMBRESUBPROGRAMA "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, tcs_ben_programa programa, (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                           FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, tcs_ben_programa programa\n"
								+ "                           WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ "                                 otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                 subprograma.codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy')) bene "
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo = programa.codigo AND\n"
								+ " subprograma.codigo <> ? ";
						parameters.add(criteria.getCodeSubprogramaFuente());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getCodeSubprogramaFuente());
					}
				} else if (criteria.getInclusion().equals("SoloFuente")) {
					if (criteria.getCodeSubprogramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') "
								+ " MINUS\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') ";
						parameters.add(criteria.getCodeSubprogramaFuente());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getCodeSubprogramaDestino());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());

					} else if (criteria.getCodeProgramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') "
								+ " MINUS\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') ";
						parameters.add(criteria.getCodeSubprogramaFuente());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getCodeProgramaDestino());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
					} else {
						query = "SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO \n"
								+ " FROM tcs_ben_beneficiario beneficiario,tcs_ben_beneficio_otorgado otorgado \n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') "
								+ " MINUS\n"
								+ " SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                           FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ "                           WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ "                                 otorgado.sbpr_codigo = ? "
								+ " AND\n"
								+ "                                 otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy')) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ? AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene";
						parameters.add(criteria.getCodeSubprogramaFuente());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getCodeSubprogramaFuente());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getCodeSubprogramaFuente());
					}
				}
			} else {
				if (criteria.getInclusion().equals("Ambos")) {
					if (criteria.getCodeSubprogramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') "
								+ " INTERSECT\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.FECHA_BENEFICIO between to_date(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') AND "
								+ " otorgado.sbpr_codigo = ? ";

						parameters.add(criteria.getCodeProgramaFuente());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getCodeSubprogramaDestino());

					} else if (criteria.getCodeProgramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') "
								+ " INTERSECT\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy')";

						parameters.add(criteria.getCodeProgramaFuente());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getCodeProgramaDestino());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
					} else {
						query = "SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE,"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO, programa.NOMBRE NOMBREPROGRAMA, subprograma.NOMBRE NOMBRESUBPROGRAMA "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_programa programa, \n"
								+ " tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, \n"
								+ "                           (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                                   FROM tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ "                                   WHERE otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                   otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') AND "
								+ "                                   subprograma.prg_codigo = ?) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo = programa.codigo AND\n"
								+ " subprograma.prg_codigo <> ? AND\n"
								+ " subprograma.prg_codigo = programa.codigo";
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getCodeProgramaFuente());
						parameters.add(criteria.getCodeProgramaFuente());
					}
				} else if (criteria.getInclusion().equals("SoloFuente")) {
					if (criteria.getCodeSubprogramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') "
								+ " MINUS\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy')";
						parameters.add(criteria.getCodeProgramaFuente());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getCodeSubprogramaDestino());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());

					} else if (criteria.getCodeProgramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO between to_date(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') "
								+ " MINUS\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO between to_date(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy')";
						parameters.add(criteria.getCodeProgramaFuente());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getCodeProgramaDestino());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
					} else {
						query = "SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO \n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ? AND\n"
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') "
								+ " MINUS\n"
								+ " SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE,"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO \n"
								+ " FROM tcs_ben_beneficiario beneficiario,tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, \n"
								+ "                           (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                                   FROM tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ "                                   WHERE otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                   otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') AND "
								+ "                                   subprograma.prg_codigo = ?) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo <> ? ";
						parameters.add(criteria.getCodeProgramaFuente());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getCodeProgramaFuente());
						parameters.add(criteria.getCodeProgramaFuente());

					}
				}
			}
		} else {
			if (criteria.getCodeSubprogramaFuente() != null) {
				if (criteria.getInclusion().equals("Ambos")) {
					if (criteria.getCodeSubprogramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ? "
								+ " INTERSECT\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ?";
						parameters.add(criteria.getCodeSubprogramaFuente());
						parameters.add(criteria.getCodeSubprogramaDestino());

					} else if (criteria.getCodeProgramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ? "
								+ " INTERSECT\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ?";
						parameters.add(criteria.getCodeSubprogramaFuente());
						parameters.add(criteria.getCodeProgramaDestino());
					} else {
						query = "SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE,"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO, programa.NOMBRE NOMBREPROGRAMA, subprograma.NOMBRE NOMBRESUBPROGRAMA \n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, tcs_ben_programa programa, (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                           FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ "                           WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ "                                 otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                 subprograma.codigo = ?) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo = programa.codigo AND\n"
								+ " subprograma.codigo <> ?";

						parameters.add(criteria.getCodeSubprogramaFuente());
						parameters.add(criteria.getCodeSubprogramaFuente());
					}
				} else if (criteria.getInclusion().equals("SoloFuente")) {
					if (criteria.getCodeSubprogramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ? "
								+ " MINUS\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ?";

						parameters.add(criteria.getCodeSubprogramaFuente());
						parameters.add(criteria.getCodeSubprogramaDestino());

					} else if (criteria.getCodeProgramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ? "
								+ " MINUS\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ?";

						parameters.add(criteria.getCodeSubprogramaFuente());
						parameters.add(criteria.getCodeProgramaDestino());
					} else {
						query = "SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario,tcs_ben_beneficio_otorgado otorgado \n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ? "
								+ " MINUS\n"
								+ " SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                           FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado \n"
								+ "                           WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ "                                 otorgado.sbpr_codigo = ?) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo <> ? "
								+ " AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene";
						parameters.add(criteria.getCodeSubprogramaFuente());
						parameters.add(criteria.getCodeSubprogramaFuente());
						parameters.add(criteria.getCodeSubprogramaFuente());

					}
				}
			} else {
				if (criteria.getInclusion().equals("Ambos")) {
					if (criteria.getCodeSubprogramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ? "
								+ " INTERSECT\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ?";

						parameters.add(criteria.getCodeProgramaFuente());
						parameters.add(criteria.getCodeProgramaDestino());

					} else if (criteria.getCodeProgramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ? "
								+ " INTERSECT\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ?";

						parameters.add(criteria.getCodeProgramaFuente());
						parameters.add(criteria.getCodeProgramaDestino());
					} else {
						query = "SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE,"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO, programa.NOMBRE NOMBREPROGRAMA, subprograma.NOMBRE NOMBRESUBPROGRAMA "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_programa programa, \n"
								+ " tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, \n"
								+ "                           (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                                   FROM tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ "                                   WHERE otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                   subprograma.prg_codigo = ?) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo <> ? AND\n"
								+ " subprograma.prg_codigo = programa.codigo";

						parameters.add(criteria.getCodeProgramaFuente());
						parameters.add(criteria.getCodeProgramaFuente());
					}
				} else if (criteria.getInclusion().equals("SoloFuente")) {
					if (criteria.getCodeSubprogramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ? "
								+ " MINUS\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = ?";

						parameters.add(criteria.getCodeProgramaFuente());
						parameters.add(criteria.getCodeSubprogramaDestino());

					} else if (criteria.getCodeProgramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ? "
								+ " MINUS\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ?";

						parameters.add(criteria.getCodeProgramaFuente());
						parameters.add(criteria.getCodeProgramaDestino());
					} else {
						query = "SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_programa programa, \n"
								+ " tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = ? "
								+ " MINUS\n"
								+ " SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE,"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_programa programa, \n"
								+ " tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, \n"
								+ "                           (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                                   FROM tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ "                                   WHERE otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                   subprograma.prg_codigo = ?) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo <> ?";

						parameters.add(criteria.getCodeProgramaFuente());
						parameters.add(criteria.getCodeProgramaFuente());
						parameters.add(criteria.getCodeProgramaFuente());

					}
				}
			}
		}

		BeneficiarioVO bene = null;
		ArrayList<BeneficiarioVO> beneficiarios = new ArrayList<BeneficiarioVO>();
		try {
			pstmt = conn.prepareStatement(query);
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();

			if (criteria.getCodeProgramaDestino() == null
					&& criteria.getCodeSubprogramaDestino() == null
					&& criteria.getInclusion().equals("Ambos")) {
				while (rst.next()) {
					bene = new BeneficiarioVO();
					bene.setNumeroDocumento(rst.getString("NUMERODOCUMENTO"));
					bene.setTipoDocumento(rst.getString("TIPODOCUMENTO"));
					bene.setNombre1(rst.getString("PRIMERNOMBRE"));
					bene.setNombre2(rst.getString("SEGUNDONOMBRE"));
					bene.setPrimerApellido(rst.getString("PRIMERAPELLIDO"));
					bene.setSegundoApellido(rst.getString("SEGUNDOAPELLIDO"));
					bene.setPrograma(rst.getString("NOMBREPROGRAMA"));
					bene.setBeneficio(rst.getString("NOMBRESUBPROGRAMA"));
					beneficiarios.add(bene);
					bene = null;
				}
			} else {
				while (rst.next()) {
					bene = new BeneficiarioVO();
					bene.setNumeroDocumento(rst.getString("NUMERODOCUMENTO"));
					bene.setTipoDocumento(rst.getString("TIPODOCUMENTO"));
					bene.setNombre1(rst.getString("PRIMERNOMBRE"));
					bene.setNombre2(rst.getString("SEGUNDONOMBRE"));
					bene.setPrimerApellido(rst.getString("PRIMERAPELLIDO"));
					bene.setSegundoApellido(rst.getString("SEGUNDOAPELLIDO"));
					beneficiarios.add(bene);
					bene = null;
				}
			}

		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}

		return beneficiarios;
	}

	public Long findCantidadBeneficiarios(RepDetCruceVO criteria)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "";
		List<Object> parameters = new ArrayList<Object>();

		if (!criteria.getDesde().equals("") && !criteria.getHasta().equals("")) {
			if (criteria.getCodeSubprogramaFuente() != null) {
				if (criteria.getInclusion().equals("Ambos")) {
					if (criteria.getCodeSubprogramaDestino() == null
							&& criteria.getCodeProgramaDestino() == null) {
						query = "SELECT COUNT(DISTINCT  beneficiario.CODIGO) CantidadBeneficiarios"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, tcs_ben_programa programa, (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                           FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, tcs_ben_programa programa\n"
								+ "                           WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ "                                 otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                 subprograma.codigo = ? AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy')) bene "
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo = programa.codigo AND\n"
								+ " subprograma.codigo <> ?";
						parameters.add(criteria.getCodeSubprogramaFuente());
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getCodeSubprogramaFuente());
					}
				}
			} else {
				if (criteria.getInclusion().equals("Ambos")) {
					if (criteria.getCodeSubprogramaDestino() == null
							&& criteria.getCodeProgramaDestino() == null) {
						query = "SELECT COUNT(DISTINCT  beneficiario.CODIGO) CantidadBeneficiarios"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_programa programa, \n"
								+ " tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, \n"
								+ "                           (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                                   FROM tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ "                                   WHERE otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                   otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') AND "
								+ "                                   subprograma.prg_codigo = ?) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo = programa.codigo AND\n"
								+ " subprograma.prg_codigo <> ? AND\n"
								+ " subprograma.prg_codigo = programa.codigo";
						parameters.add(criteria.getDesde());
						parameters.add(criteria.getHasta());
						parameters.add(criteria.getCodeProgramaFuente());
						parameters.add(criteria.getCodeProgramaFuente());
					}
				}
			}
		} else {
			if (criteria.getCodeSubprogramaFuente() != null) {
				if (criteria.getInclusion().equals("Ambos")) {
					if (criteria.getCodeSubprogramaDestino() == null
							&& criteria.getCodeProgramaDestino() == null) {
						query = "SELECT COUNT(DISTINCT  beneficiario.CODIGO) CantidadBeneficiarios"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, tcs_ben_programa programa, (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                           FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ "                           WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ "                                 otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                 subprograma.codigo = ?) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo = programa.codigo AND\n"
								+ " subprograma.codigo <> ?";
						parameters.add(criteria.getCodeSubprogramaFuente());
						parameters.add(criteria.getCodeSubprogramaFuente());

					}
				}
			} else {
				if (criteria.getInclusion().equals("Ambos")) {
					if (criteria.getCodeSubprogramaDestino() == null
							&& criteria.getCodeProgramaDestino() == null) {
						query = "SELECT COUNT(DISTINCT  beneficiario.CODIGO) CantidadBeneficiarios"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_programa programa, \n"
								+ " tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, \n"
								+ "                           (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                                   FROM tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ "                                   WHERE otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                   subprograma.prg_codigo = ?) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo <> ? AND\n"
								+ " subprograma.prg_codigo = programa.codigo";
						parameters.add(criteria.getCodeProgramaFuente());
						parameters.add(criteria.getCodeProgramaFuente());
					}
				}
			}
		}
		try {
			pstmt = conn.prepareStatement(query);
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();
			rst.next();
			return (new Long(rst.getLong("CantidadBeneficiarios")));
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public RepDetCruceVO findFilters(RepDetCruceVO repDetCruceVO)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strQuery = null;

		if (repDetCruceVO.getCodeProgramaFuente() != null) {
			strQuery = "SELECT NOMBRE FROM TCS_BEN_PROGRAMA WHERE CODIGO = ?";
			try {
				pstmt = conn.prepareStatement(strQuery);
				pstmt.setLong(1, repDetCruceVO.getCodeProgramaFuente()
						.longValue());
				rst = pstmt.executeQuery();
				rst.next();
				repDetCruceVO.setNombreProgramaFuente(rst.getString("NOMBRE"));
			} catch (SQLException e) {
				throw new DAOException(e);
			} finally {
				close(rst, pstmt);
			}
		}
		if (repDetCruceVO.getCodeSubprogramaFuente() != null) {
			strQuery = "SELECT NOMBRE FROM TCS_BEN_SUBPROGRAMA WHERE CODIGO = ?";
			try {
				pstmt = conn.prepareStatement(strQuery);
				pstmt.setLong(1, repDetCruceVO.getCodeSubprogramaFuente()
						.longValue());
				rst = pstmt.executeQuery();
				rst.next();
				repDetCruceVO.setNombreSubprogramaFuente(rst
						.getString("NOMBRE"));
			} catch (SQLException e) {
				throw new DAOException(e);
			} finally {
				close(rst, pstmt);
			}
		}
		if (repDetCruceVO.getCodeProgramaDestino() != null) {
			strQuery = "SELECT NOMBRE FROM TCS_BEN_PROGRAMA WHERE CODIGO = ?";
			try {
				pstmt = conn.prepareStatement(strQuery);
				pstmt.setLong(1, repDetCruceVO.getCodeProgramaDestino()
						.longValue());
				rst = pstmt.executeQuery();
				rst.next();
				repDetCruceVO.setNombreProgramaDestino(rst.getString("NOMBRE"));
			} catch (SQLException e) {
				throw new DAOException(e);
			} finally {
				close(rst, pstmt);
			}
		}
		if (repDetCruceVO.getCodeSubprogramaDestino() != null) {
			strQuery = "SELECT NOMBRE FROM TCS_BEN_SUBPROGRAMA WHERE CODIGO = ?";
			try {
				pstmt = conn.prepareStatement(strQuery);
				pstmt.setLong(1, repDetCruceVO.getCodeSubprogramaDestino()
						.longValue());
				rst = pstmt.executeQuery();
				rst.next();
				repDetCruceVO.setNombreSubprogramaDestino(rst
						.getString("NOMBRE"));
			} catch (SQLException e) {
				throw new DAOException(e);
			} finally {
				close(rst, pstmt);
			}
		}
		return repDetCruceVO;
	}
}
